import requests
import pandas as pd
import matplotlib.pyplot as plt

def fetch_and_save_data():
    # 添加请求头
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
    }

    # 胡润百富获取的数据，发现是异步加载，并不需要soup去解析网页，通过开发人员工具发现通过get请求可以直接请求数据
    url = 'https://www.hurun.net/zh-CN/Rank/HsRankDetailsList?num=A3I4FTLA&search=&offset=0&limit=500'
    # 设置好request并使用json解析好
    response = requests.get(url, headers=headers)
    json_data = response.json()
    print('开始处理数据')
    # 构建DataFrame对象
    data_list = []
    for data in json_data['rows']:
        # 提取数据
        name = data['hs_Rank_Global_ChaName_Cn']  # 姓名
        company = data['hs_Rank_Global_ComName_Cn']  # 公司
        industry = data['hs_Rank_Global_Industry_Cn']  # 从事行业
        wealth = data['hs_Rank_Global_Wealth']  # 总财富
        rank = data['hs_Rank_Global_Ranking']  # 排名
        permanent = data['hs_Character'][0]['hs_Character_Permanent_Cn']  # 籍贯

        # 将提取的数据添加到列表中
        data_list.append({'排名': rank, '姓名': name, '总财富': wealth, '公司': company, '从事行业': industry, '籍贯': permanent})

    # 创建DataFrame
    df = pd.DataFrame(data_list)

    # 将DataFrame写入Excel文件中
    excel_file = 'HurunRichRank.xlsx'
    with pd.ExcelWriter(excel_file) as writer:
        df.to_excel(writer, sheet_name='2024胡润全球富豪榜前500位', index=False)

    print(f'{excel_file}已经保存成功')

def clean():
    # 读取Excel文件
    df = pd.read_excel('HurunRichRank.xlsx')

    # 去除重复值
    df.drop_duplicates(inplace=True)

    # 统一格式处理
    # 将总财富列格式统一为字符串，并添加亿美元单位
    df['总财富'] = df['总财富'].astype(str) + '亿美元'
    # 对籍贯列进行处理，只保留第一个籍贯
    df['籍贯'] = df['籍贯'].apply(lambda x: x.split('-')[0])

    # 缺失值填充为0
    df.fillna(0, inplace=True)

    # 将数据保存回Excel文件
    df.to_excel('HurunRank_cleaned.xlsx', index=False)
    print('清理完毕')

def plot_data():
    # 读取Excel文件
    df = pd.read_excel('HurunRank_cleaned.xlsx')

    plt.rcParams['font.sans-serif'] = ['SimHei']
    # 绘制籍贯占比饼图
    native_counts = df['籍贯'].value_counts().head(10)
    plt.figure(figsize=(6, 6))
    plt.pie(native_counts, labels=native_counts.index, autopct='%1.1f%%', startangle=140)
    plt.title('胡润全球富豪榜籍贯占比(前10个国家)')
    plt.axis('equal')  # 使饼图比例相等

    # 绘制行业富豪分布柱状图
    top_20_industries = df['从事行业'].value_counts().sort_values(ascending=False).head(20)
    plt.figure(figsize=(10, 6))
    top_20_industries.plot(kind='bar', color='skyblue')
    plt.title('胡润全球富豪榜单前20个行业富豪分布')
    plt.xlabel('从事行业')
    plt.ylabel('富豪数量')
    plt.xticks(rotation=30, ha='right')
    plt.tight_layout()

    # 绘制前25位富豪财富值水平条形图
    df_sorted = df.sort_values(by='排名')
    names = df_sorted['姓名'].head(25).tolist()
    total_wealth = df_sorted['总财富'].head(25).tolist()
    plt.figure(figsize=(10, 6))  # 调整图形大小
    plt.barh(names[::-1], total_wealth[::-1], color='skyblue')  # 将列表反转，确保最富有的人排在最上面
    plt.xlabel('Total Wealth (Billions of USD)')
    plt.title('胡润全球富豪榜前25财富值')
    plt.tight_layout()  # 调整布局，防止标签被截断
    plt.xticks(rotation=30, ha='right')
    plt.show()

if __name__ == "__main__":
    fetch_and_save_data()
    clean()
    plot_data()
